package com.glela.goods.service;

import java.io.IOException;
import java.text.ParseException;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.http.ResponseEntity;

import com.glela.common.model.ProductTag;
import com.glela.goods.model.Brand;
import com.glela.goods.model.Goods;
import com.glela.goods.model.GoodsNavigate;
import com.glela.goods.model.GoodsPrice;
import com.glela.goods.model.request.GoodsRequest;
import com.glela.goods.model.vo.InventoryVo;
import com.glela.goods.model.vo.goods.GoodSerialVo;
import com.glela.goods.model.vo.goods.GoodsESVo;
import com.glela.goods.model.vo.goods.GoodsListResponse;
import com.glela.goods.model.vo.goods.GoodsPageVo;
import com.glela.goods.model.vo.goods.GoodsResponse;
import com.glela.goods.model.vo.goods.GoodsSimpleVo;
import com.glela.goods.model.vo.goods.GoodsVo;
import com.glela.goods.model.vo.goods.OpenStoreGoodsVo;
import com.glela.goods.model.vo.goods.SimpleGoods;
import com.glela.goods.model.vo.goods.StreamerResponse;
import com.glela.platform.model.User;
import com.glela.platform.model.request.RequestPageBaseModel;
import com.glela.platform.model.response.ResponsePageModel;

public interface GoodsService {

	public InventoryVo selectInventoryById(long inventoryId);
	/**
	 * 根据商品在库存表的库存价和分享者、用户的角色计算最低价
	 * @author 高玮琪
	 * @return
	 */
	public int getLowestPrice(Goods goods, int shareUserRoleId, int seeUserRoleId);

	/**
	 * 商品最低价，单位:分;(2017-06-13优化)
	 * 
	 * @author 卫耀华
	 * @param simpleGoods
	 * @param shareUserRoleId
	 * @param seeUserRoleId
	 * @return
	 */
	public int getLowestPrice(GoodsSimpleVo simpleGoods, int shareUserRoleId, int seeUserRoleId);

	/**
	 * 公共方法
	 * 
	 * @param goodsId
	 * @param roleId
	 * @return
	 */
	public GoodsVo selectGoodsById(long goodsId, int shareUserRoleId, int roleId);

	/**
	 * 内部商品列表调用
	 * 
	 * @param goodsId
	 * @return
	 */
	public GoodsPageVo selectGoodsPageById(long goodsId, int roleId);
	
	/**
	 * 开放接口
	 * 
	 * @param goodsId
	 * @param seeUserRoleId
	 * @return
	 */
	public ResponseEntity<?> getGoodsById(long goodsId, int shareUserRoleId, int seeUserRoleId,String livePlanId);

	/**
	 * 商品分页
	 * 
	 * @param goods
	 * @return
	 */
	public ResponsePageModel<GoodsPageVo> selectGoodsPage(RequestPageBaseModel page);
	
	public GoodsPrice getGoodsViewPriceForGoods(User user,long goodsid) throws RuntimeException;
	/**
	 * 根据条件查询
	 * 
	 * @param page
	 * @return
	 */
	public List<GoodsPageVo> listGoodsPageByBrandId(int brandId, int seeUserRoleId, int startIndex, int pageSize);

	public int countGoodsPageByBrandId(int brandId);

	public ResponseEntity<?> listGoodsPageByCategoryId(int categoryId, List<Integer> brandIdList, int order,
			long userId, int pageNum, int startIndex, int pageSize);

	/**
	 * 根据子分类id查询 所有商品 不重复的 品牌列表
	 * 
	 * @param categoryId
	 * @return
	 */
	public ResponsePageModel<Brand> listBrandIdByCategoryId(int categoryId);

	/**
	 * 首页热销单品
	 * 
	 * @author 卫耀华
	 * @param userId
	 * @param pageNum
	 * @param startIndex
	 * @param pageSize
	 * @return
	 */
	public ResponseEntity<?> hotSale(long userId, int pageNum, int startIndex, int pageSize);

	public List<GoodsNavigate> selectGoodImgByGoodIdList(List<Long> goodIdList);

	/**
	 * 获取商品热搜词
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public List<String> getHotSearchWords();

	/**
	 * ES搜商品--分页
	 * 
	 * @param goodsType
	 * @param roleId
	 * @param searchKeyWord
	 * @param startIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	public List<GoodsSimpleVo> esSearchGoods(int goodsType, int roleId, String searchKeyWord, int startIndex,
			int pageSize) throws Exception;

	/**
	 * ES搜商品--count
	 * 
	 * @param goodsType
	 * @param searchKeyWord
	 * @return
	 * @throws Exception
	 */
	public int esSearchGoodsCount(int goodsType, String searchKeyWord) throws Exception;

	/**
	 * 校妆APP讲师推荐商品列表分页
	 * 
	 * @author 卫耀华
	 * @param userId
	 * @param startIndex
	 * @param pageSize
	 * @return
	 */
	public List<GoodsSimpleVo> jiangShiTuiJianGoods(Long userId, int startIndex, Integer pageSize);

	/**
	 * 校妆APP讲师推荐商品列表分页总记录数
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public int countTeacherRecommendGoods();

	/**
	 * 讲师推荐
	 * 
	 * @return
	 */
	public List<GoodsResponse> selectGoodsResponse(long teacherId) throws ParseException;

	public int insertTeacherMessage(List<GoodsResponse> listGoodsResponse, long teacherId);

	public List<StreamerResponse> listStreamerResponse(long teacherId);

	public List<GoodsListResponse> GoodsListResponse(long teacherId, int page, int pageSize, int orderType);

	public int GoodsListResponseCount();

	public List<GoodsListResponse> searchGoodsList(String labelName, long teacherId, int page, int pageSize);

	public int searchGoodsListCount(String labelName);

	public List<GoodsListResponse> listNewGoods(long userId, int page, int pageSize);

	public int listNewGoodsCount();

	/**
	 * 获取商品列表中要展示的主图片（一张）(校妆网APP)
	 * 
	 * @author 卫耀华
	 * @param goodsId
	 * @return
	 */
	public String getGoodsPicture(long goodsId);

	/**
	 * 设置商品的导航图 按照角色设置价格
	 * 
	 * @author 高玮琪
	 * @return
	 */
	public GoodsSimpleVo toSimpleGoodsVo(Goods goods, int shareUserRoleId, int roleId);

	/**
	 * SimpleGoods属性值拷贝到GoodsSimpleVo中 并根据分享者角色和用户角色设置商品价格
	 * @return
	 */
	public List<GoodsSimpleVo> simpleGoodsTrans(List<SimpleGoods> goodsList, int shareUserRoleId, int roleId);

	/**
	 * 自动同步数据库里的C区商品信息到ES
	 * 
	 * @author 卫耀华
	 */
	public void syncGoodsCToES();

	/**
	 * 自动同步数据库里的B区商品信息到ES
	 * 
	 * @version 2017-02-28
	 * @author 卫耀华
	 */
	public void syncGoodsBToES();

	/**
	 * 自动同步数据库里的品牌信息到ES
	 * 
	 * @author 卫耀华
	 */
	public void syncBrandToES();
	
	
	/***
	 * 
	 * 获取产品在APP上面的显示价格 : 按GOODSID
	 * 区分用户，产品状态： 如，同一产品在抢购时段和正常时段的价格是不一样的。
	 * user : 登录人对应的店主
	 * @return zyf
	 * 
	 */
	//public GoodsPrice getGoodsViewPriceForGoods(User user,long goodsid) throws RuntimeException ;
	
	
	/***
	 * 
	 * 获取产品在APP上面的显示价格 : 按PRODUCT_ID
	 * 区分用户，产品状态： 如，同一产品在抢购时段和正常时段的价格是不一样的。
	 * user : 登录人对应的店主
	 * @return zyf
	 * 
	 */
	public GoodsPrice getGoodsViewPriceForProduct(User user,long productId) throws RuntimeException;
	

	/**
	* **********************************************
	* @Title: getGoodsInfoById 
	* @Description: 根据id查找goods
	* @param @param goodsId
	* @param @param productId
	* @param @param limitTimeSaleId
	* @param @param userId
	* @param @param storeUserId
	* @param @param from
	* @param @return 
	* @return GoodsVo
	* @throws	
	* @author NingChongQing	
	* @date 2017年10月30日 下午2:27:17 
	* **********************************************
	 */
	public GoodsVo getGoodsInfoById(long goodsId, Long productId, int limitTimeSaleId, long userId, Integer storeUserId, String from);
	/**
	* @Title: selectOneGoodById
	* @Description: 根据id查询商品
	* @param 商品id
	* @param @return    参数
	* @return GoodSerialVo    返回类型
	* @throws
	* @author zhangrenjie
	* @date 2017年7月14日
	*/
	public GoodSerialVo selectOneGoodById(long id);
	
	
	/***
	 * 公共方法，可扩展
	 * @param goodsid 产品ID
	 * @param productId 规格ID
	 * 
	 * @return 产品对应的要显示的标签
	 */
	public List<ProductTag> getGoodsTag(Long goodsid,Long productId);
	
	
	/***
	 * 
	 * @param pid : 查询ID ，当TYPE为1 时 这个PID为GOODSID, TYPE 为2时 这个PID为 PRODUCTID
	 * @param limie_sale_id 分时抢购ID
	 * @param type ： 查询类型 当TYPE为1 时 这个 PID为GOODSID, TYPE 为2时 这个PID为 PRODUCTID
	 *        user :　店主
	 * @return
	 * @throws Exception
	 */
	public  GoodsPrice getLimitTimeSalePrice(User user, Long pid , Integer limie_sale_id, int type) throws Exception ;
	
	/**
	* **********************************************
	* @Title: esGlobalSearchGoods
	* @Description: es全局搜索商品
	* @param @param storeUserId
	* @param @param searchKeyWord
	* @param @param startIndex
	* @param @param pageSize
	* @param @return    设定文件
	* @return List<GoodsSimpleVo>    返回类型
	* @throws		异常
	* @author NingChongQing		作者
	* @date 2017年7月21日 上午9:10:02		时间
	* **********************************************
	 */
	public List<GoodsESVo> esGlobalSearchGoods(Integer storeUserId,String searchKeyWord, int startIndex, Integer pageSize,User user) throws Exception;
	
	/***
	 * 
	 * @param user ： 用户所对应的店主用户 用于根据用户ROLEID 计算分佣数
	 * @param goodsid  用户ID
	 * @param limitSaleTimeId 分时抢购ID
	 * @return  
	 * @throws RuntimeException
	 */
	public GoodsPrice getGoodsViewPriceForGoods(User user, long goodsid, long limitSaleTimeId) throws RuntimeException;
	
	/***
	 * 批量查询GOODS当前应售价格
	 * @param user 店主ID
	 * @param goodsIds GOODSID  数组
	 * @return
	 */
	public Map<Long,GoodsPrice> getGoodsViewPriceForGoods(User user, List<Long> goodsIds);
	
	
	/***
	 * 按批次查询分时抢购价格
	 * @param user : 登录用户的推荐人 ，一般是店主角色
	 * @param limitTimeSaleId
	 * @param goodsIds
	 * @return ： MAP<Long,GoodsPrice>   <goodsId , GoodsPrice>
	 */
	public Map<Long,GoodsPrice> getGoodsViewPriceForGoodsLimitTimeSale(User user, int limitTimeSaleId, Collection<Long> goodsIds);

	//查询品牌馆列表新接口
	public ResponseEntity<?>  listGoodsPageByBrandIdNew(GoodsRequest request);
	
	/**
	* **********************************************
	* @Title: selectMaterialsByGoodsIdWithPage 
	* @Description: 查询商品素材信息 
	* @param @param goodsId
	* @param @param page
	* @param @param pageSize
	* @param @return 
	* @return List<Map<String,Object>>
	* @throws	
	* @author NingChongQing	
	* @date 2017年11月27日 下午3:01:28 
	* **********************************************
	 */
	public List<Map<String,Object>> selectMaterialsByGoodsIdWithPage(long goodsId, int page, Integer pageSize);
	
	/**
	 *  商品详情页预览
	 */
	public GoodsVo goodsInfoPreview(long goodsId, Integer storeUserId);
	
	/**
	 * 新ES搜索
	 * @throws IOException 
	 */
	public List<GoodsListResponse> newGoodsEsSearchGoods(Integer storeUserId, String searchKeyWord, int startIndex, Integer pageSize) throws IOException;
	
	/**
	 * 统计商品搜索词汇
	 */
	public void statisticsGoodsSearchWords(String searchKeyWord);

	/**
	 * 处理商品上下架次数redis缓存
	 * @param goods
	 * @return
	 */
	public Goods getGoodsUpDownCount(Goods goods);

	/** 查询开店商品 */
	public List<OpenStoreGoodsVo> findOpenStoreGoods(boolean showAll, Date avlDay);
}
